01. 잘못된 구조의 문제 깨닫기

📌 Contents

📌 의미를 알 수 없는 이름

  • Int, Memory, Flag 등 프로그래밍이나 컴퓨터 용어를 기반으로 이름을 붙이는 것을 기술 중심 명명이라고 함
  • 클래스와 메서드에 번호를 붙여서 이름을 짓는 것을 일련번호 명명이라고 함
  • 기술을 기반으로 이름을 짓거나 일련번호를 매겨 이름을 지으면 코드에서 어떠한 의도도 읽어 낼 수 없음

📌 이해하기 어렵게 만드는 조건 분기 중첩

  • 조건 분기란 조건에 따라 처리 방식을 다르게 하는 데 사용되는 프로그래밍 언어의 기본 제어 구조
  • 조건 분기를 어설프게 사용하면, 악마가 되어 개발자들을 괴롭힘
  • if 조건문 내부에 if 조건문이 계속해서 중첩되어 있다면 코드의 가독성이 나빠짐
  • 어디서부터 어디까지가 if 조건문 처리 블록인지 확인하기가 힘듬
  • 코드를 이해하기 어려워 분기 로직을 정확하게 이해하지 못하고 기능을 변경하면, 버그가 발생할 수 있음

📌 수많은 악마를 만들어 내는 데이터 클래스

  • 데이터 클래스는 설계가 제대로 이루어지지 않은 소프트웨어에서 빈번하게 등장하는 클래스 구조
  • 데이터를 갖고 있기만 하는 클래스를 데이터 클래스라고 부름
  • 데이터를 처리하는 로직은 다른 클래스에 있고 데이터만 있는 클래스가 생기는 이유는 설계를 따로 고려하지 않아서 생김
  • 데이터 클래스는 단순한 구조이지만, 수많은 악마를 만들어 낼 수 있음

사양을 변경할 때 송곳니를 드러내는 악마

  • 어떤 서비스에서 사양이 변경되었을 때 로직을 수정했음에도 수정되지 않았다는 장애가 나올 수 있음. 해당 로직이 여러군데에 있기 때문임
  • 여러 상황에서 필요한 데이터를 처리하는 로직은 여러 곳에 구현되기 쉬움
  • 로직을 한곳에 만들어 두면, 다른 곳에 구현하지 않을거라 생각하지만, 설계에 관심이 없으면 필요한 로직이 이미 구현되어 있다는 사실을 모르고 또 구현할 수 있음
  • 이런 상황은 데이터를 담고 있는 클래스와 데이터를 사용하는 계산 로직이 멀리 떨어져 있을 때 자주 일어남
  • 이처럼 데이터와 로직 등이 분산되어 있는 것을 응집도가 낮은 구조라고 함. 이때 여러 문제가 생길 수 있음

    1. 코드 중복: 같은 로직을 여러 곳에 구현할 수 있음
    2. 수정 누락: 코드 중복이 많으면, 사양이 변경될 때 중복된 코드를 모두 고쳐야 하는데 이 때 일부 코드를 놓칠 수 있음
    3. 가독성 저하: 코드가 분산되어 있으면 중복된 코드를 포함해 관련된 정보를 다 찾는 것만으로도 시간이 오래 걸려 가독성이 저하됨
    4. 초기화되지 않은 상태(쓰레기 객체): 초기화하지 않으면 쓸모 없는 클래스, 초기화하지 않은 상태가 발생할 수 있는 클래스. 안티 패턴 쓰레기 객체라 부름
    5. 잘못된 값 할당: 잘못된 값이 들어가지 않게 데이터 클래스를 사용하는 쪽의 로직을 살짝 변경해 유효성 검사를 해줄 수 있지만, 그렇게 되면 사용하는 모든 곳의 코드를 수정해야해서 앞서 언급한 코드 응집도가 낮아 생기는 폐해가 똑같이 일어남. (코드 중복, 수정 누락, 가독성 저하)
  • 데이터 클래스라는 악마 한 마리가 수많은 악마를 불러들여, 버그를 발생시키고 가독성을 해침

  • 결과적으로 이와 같은 문제들은 개발 생산성을 떨어뜨림

📌 악마 퇴치의 기본

  • 악마를 퇴치하려면 일단 나쁜 구조의 폐해를 인지해야함
  • 나쁜 폐헤를 인지하면, '어떻게든 대처해야겠다'라고 생각헤게 됨. 이 생각이 바로 좋은 설계를 위한 첫걸음
  • 이어서 객체 지향의 기본인 클래스를 적절하게 설계해야함. 객체 지향 설계가 곧 악마를 퇴치하는 무기

❓ Questions

❓ 데이터 클래스를 사용하면 왜 쓰레기 객체가 생길까?

public class ContractAmount {
  public int amountIncludingTax; // 세금 포함 금액
  public BigDecimal salesTaxRate; // 소비세율
}
  • 위와 같은 데이터 클래스를 사용할 때 클래스를 불러온 후 ContractAmount.salesTaxRate = {초기 값} 이런 식으로 값을 넣어 초기화를 할 수 있지 않나?
  • 위와 같은 방식으로 하면 초기화를 까먹을 수 도 있는데, 생성자를 이용해서 초기화를 하도록 클래스를 작성하면 클래스만 보고도 초기화가 필요하다는 것을 알게 되어서 생성자가 없는 데이터 클래스에서는 쓰레기 객체가 생기는 것인가?
  • 그럼 그냥 아래 처럼 처음부터 초기값을 넣어주면 안되나?
public class ContractAmount {
  public int amountIncludingTax = {초기 값}; // 세금 포함 금액
  public BigDecimal salesTaxRate = {초기 값}; // 소비세율
}


  • 일단 위와 같이 public int amountIncludingTax = {초기 값};로 초기화를 하면 클래스에 그냥 데이터만 있는 것이 아니라 데이터에 값도 들어가 있는 상태라 책에서 얘기하는 데이터 클래스와 맞지 않는 것 같다.
  • 그리고 생성자에 매개 변수를 받아서 초기화 하는 로직을 넣어 둔다면 초기화를 까먹었을 때 컴파일 오류가 나지만, 클래스를 불러온 후 ContractAmount.salesTaxRate = {초기 값} 이런 식으로 값을 초기화하려 했을 때 까먹는 다면 런타임 오류가 나기 때문에 초기화가 필요하다면 데이터만 있는 데이터 클래스를 쓰지 말고, 생성자를 선언해 초기화를 해주라고 책에서 얘기하고 싶은 것 같다.
  • 런타임 오류가 나면 컴파일 오류보다 오류를 찾기 쉽지 않기 때문에 컴파일 오류가 나는 것이 낫다고 생각한다.
  • 또 찾아보면서 새롭게 알게 된것은 자바에서 클래스에 변수를 선언하면 자동으로 초기화를 해준다고 한다. 다만 int나 string 기본 자료형만 그렇게 되는 것 같고, BigDecimal 같은 클래스로 된 자료형 같은 경우는 안해주는 것 같다. 그래서 BigDecimal을 사용 했을 때 쓰레기 객체가 나올 수 있는 것이다.

results matching ""

    No results matching ""